package com.hc.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.util.Calendar;

public class JwtUtils {

    // 密钥（这里使用HS256算法，密钥必须为byte[]类型）
    private static final byte[] SECRET_KEY = "dws#@!dfdfdf%adadad1254@45@d4".getBytes();

    // JWT过期时间（单位：毫秒）
    private static final int EXPIRATION_TIME = 86400000; // 24小时

    /**
     * 创建JWT
     * @return token字符串
     */
    public static String generateToken(String username) {

        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.SECOND, EXPIRATION_TIME);
        return JWT.create()
                .withClaim("sub", username) //payload
                .withExpiresAt(instance.getTime()) //设置过期时间
                .sign(Algorithm.HMAC256(SECRET_KEY));//签名(这里自定义密钥即可)

    }

    /**
     * 解析JWT并验证其有效性
     * @param token JWT字符串
     * @return Claims对象，包含JWT中的声明
     * @throws Exception 解析或验证失败抛出异常
     */
    public static String getUserNameByToken(String token){

        return   getDecodedJWT(token).getClaim("sub").asString();
    }

    /**
     * 获取token过期时间
     * @param token
     * @return
     */
    public  static Long getTokenExpired(String token){
       return getDecodedJWT(token).getExpiresAt().getTime();
    }


    /**
     * 获取 Token 信息
     * @param token
     * @return
     */
    public static DecodedJWT getDecodedJWT(String token) {
        DecodedJWT verify = JWT.require(Algorithm.HMAC256(SECRET_KEY)).build().verify(token);
        return verify;
    }


    /**
     * 验证 Token 合法性
     * @param token
     */
    public static boolean checkToken(String token) {
        try {
            JWT.require(Algorithm.HMAC256(SECRET_KEY)).build().verify(token);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    public static String refreshToken(String token){
        String userName = getUserNameByToken(token);
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.SECOND, 100);
        return JWT.create()
                .withClaim("sub", userName) //payload
                .withExpiresAt(instance.getTime()) //设置过期时间
                .sign(Algorithm.HMAC256(SECRET_KEY));//签名(这里自定义密钥即可)
    }
}
